package com.cyan.teamquestionnaire.service.Impl;

import com.cyan.teamquestionnaire.beans.PageInfo;
import com.cyan.teamquestionnaire.entity.AnswerSheet;
import com.cyan.teamquestionnaire.entity.Questionnaire;
import com.cyan.teamquestionnaire.entity.QuestionnaireFee;
import com.cyan.teamquestionnaire.entity.User;
import com.cyan.teamquestionnaire.mappers.AnswerSheetMapper;
import com.cyan.teamquestionnaire.mappers.GroupMapper;
import com.cyan.teamquestionnaire.mappers.QuestionnaireMapper;
import com.cyan.teamquestionnaire.mappers.UserMapper;
import com.cyan.teamquestionnaire.service.QuestionnaireService;
import com.cyan.teamquestionnaire.service.UserService;
import com.cyan.teamquestionnaire.utils.DateUtils;
import com.cyan.teamquestionnaire.utils.UUIDUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.swing.plaf.synth.SynthOptionPaneUI;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class QuestionnaireServiceImpl implements QuestionnaireService {
    @Resource
    private QuestionnaireMapper questionnaireMapper;

    @Resource
    private GroupMapper groupMapper;

    @Resource
    private AnswerSheetMapper answerSheetMapper;

    @Resource
    private UserMapper userMapper;

    // 分页--通过创建用户查询所有问卷
    @Override
    public PageInfo<Questionnaire> selectByCreatorName(PageInfo<Questionnaire> pageInfo) {
        return splitPage(pageInfo, questionnaireMapper.selectByCreatorName(pageInfo.getName()));
    }

    // 分页--通过题目模糊查询
    @Override
    public PageInfo<Questionnaire> queryQuestionnaireByTitle(PageInfo<Questionnaire> pageInfo) {
        List<Questionnaire> tmp = questionnaireMapper.queryQuestionnaireByTitle("%" + pageInfo.getQuery() + "%", pageInfo.getName());
        return splitPage(pageInfo, tmp);
    }

    // 分页--通过qid模糊查询
    @Override
    public PageInfo<Questionnaire> queryQuestionnaireByQid(PageInfo<Questionnaire> pageInfo) {
        List<Questionnaire> tmp = questionnaireMapper.queryQuestionnaireByQid("%" + pageInfo.getQuery() + "%");
        return splitPage(pageInfo, tmp);
    }

    //分页——查询模板
    @Override
    public PageInfo<Questionnaire> queryTemplateY(PageInfo<Questionnaire> pageInfo) {
        List<Questionnaire> list = questionnaireMapper.queryTemplate("%" + pageInfo.getQuery() + "%");
        return splitPage(pageInfo, list);
    }


    // 不分页--通过创建者获取问卷
    @Override
    public List<Questionnaire> selectByCreatorName(String name) {
        return questionnaireMapper.selectByCreatorName(name);
    }

    // 不分页——查询模板
    @Override
    public List<Questionnaire> queryTemplate(String title) {
        return questionnaireMapper.queryTemplate("%" + title + "%");
    }


    // 不分页--通过标题获取问卷
    @Override
    public List<Questionnaire> queryQuestionnaireByTitle(String title, String name) {
        return questionnaireMapper.queryQuestionnaireByTitle("%" + title + "%", name);
    }

    // 不分页--通过qid获取
    @Override
    public List<Questionnaire> queryQuestionnaireByQid(String qid) {
        return questionnaireMapper.queryQuestionnaireByQid("%" + qid + "%");
    }

    // 精确查询--qid
    @Override
    public Questionnaire queryQuestionnaireByQidEq(String qid) {
        return questionnaireMapper.queryQuestionnaireByQidEq(qid);
    }

    // 新建问卷
    @Override
    public void insertQuestionnaire(Questionnaire questionnaire) {
        // 生成qid
        questionnaire.setQId(UUIDUtil.getOneUUID());
        questionnaireMapper.insertQuestionnaire(questionnaire);

    }

    @Override
    public int deleteQuestionnaire(String qId) {
        //       直接根据qId删除答卷
        answerSheetMapper.deleteAnswerQuestionnaire(qId);

        return questionnaireMapper.deleteQuestionnaire(qId);
    }

    @Override
    public int groupCnt(User u) {
        return questionnaireMapper.groupCnt(u);
    }

    // 发布问卷,设置发布时间和发布状态1
    @Override
    public void issue(String qId, String gId) {
        // 需要获取gId的所有用户的name
        List<String> list = groupMapper.usersInGroup(gId);
        for (String name : list) {// 向answer_sheet写入内容
            answerSheetMapper.insertAnswer(name, qId);
        }
        questionnaireMapper.issue(qId, DateUtils.currentDate(), gId);
    }

    // 修改问卷状态
    @Override
    public void updateStatus(String qId, String status) {
        questionnaireMapper.updateStatus(qId, status);
    }

    //删除问卷的恢复
    @Override
    public void recoveryDeletedQuestionnaire(String qId) {
        Questionnaire questionnaire = questionnaireMapper.queryQuestionnaireByQidEqFromBin(qId);
        if (questionnaire.getGId() == null && questionnaire.getReleaseTime() == null) {
            questionnaireMapper.updateStatus(qId, "0");
        } else {
            questionnaireMapper.updateStatus(qId, "2");
        }

    }

    // 假删除，放入回收站，设置删除时间，状态(sql语句)
    @Override
    public int putQuestionnaireToBin(Questionnaire questionnaire) {
        questionnaire.setDeleteTime(DateUtils.currentDate());// 设置删除时间
        return questionnaireMapper.putQuestionnaireToBin(questionnaire);
    }

    //查询name删除在回收站的问卷，根据name和status查询,同时对title进行模糊查询-分页
    @Override
    public PageInfo<Questionnaire> getQuestionnaireFromBin(PageInfo<Questionnaire> pageInfo) {
        List<Questionnaire> list = questionnaireMapper.getQuestionnaireFromBin(pageInfo.getName(), "%" + pageInfo.getQuery() + "%");
        return splitPage(pageInfo, list);
    }

    //查询name删除在回收站的问卷，根据name和status查询,不分页不模糊
    public List<Questionnaire> getQuestionnaireFromBinNY(String name) {
        return questionnaireMapper.getQuestionnaireFromBin(name, "%%");
    }

    //发布问卷时候判断，这个用户是否还有空间来进行问卷发布
    @Override
    public boolean userHasSpace(String name) {
        // 发布的问卷和暂停的问卷都计算
        List<Questionnaire> list = questionnaireMapper.selectQuestionnaire12(name);
        User user = userMapper.selectByName(name);

        if (user.getCount() > list.size()) return true;
        return false;
    }

    //发布日期在今天的函数
    public int releaseTimeInToday(Map<String, Object> map) {

        String name = (String) map.get("name");
        String data = (String) map.get("releaseTime");
        DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date = simpleDateFormat.parse(data);
            String Morning = getStartOfDay(date);
            String Evening = getEndOfDay(date);
            return questionnaireMapper.releaseTimeInToday(Morning, Evening, name).size();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }

    //查询租户下的所有用户的status=1和status=2的问卷list，分页模糊。
    public PageInfo<Questionnaire> questionnaireInTenant(PageInfo<Questionnaire> pageInfo) {
        String tenant = pageInfo.getName();
        //获得用户list
        List<String> nameList = userMapper.tenantCreateUser(tenant,"%%");
        List<Questionnaire> list = new ArrayList<>();

        for (String name:nameList) {
            if (questionnaireMapper. selectByCreatorNameStatus(name,"%"+pageInfo.getQuery()+"%").size() != 0){
                list.addAll(questionnaireMapper. selectByCreatorNameStatus(name,"%"+pageInfo.getQuery()+"%"));
            }
        }
        return  splitPage(pageInfo, list);
    }


    @Override
    public int countQuestionnaire(String name) {
        return questionnaireMapper.countQuestionnaireTenant(name);
    }

    @Override
    public int updateQuestionnaireContent(Questionnaire questionnaire) {
        return questionnaireMapper.updateQuestionnaireContent(questionnaire);
    }

    @Override
    public AnswerSheet selectAnsweredSheet(AnswerSheet answerSheet) {
        return questionnaireMapper.selectAnsweredSheet(answerSheet);
    }

    @Override
    public List<AnswerSheet> selectAnswers(String qId) {
        return questionnaireMapper.selectAnswers(qId);
    }

    @Override
    public List<QuestionnaireFee> getFeeOfTenant(User user) {
        return questionnaireMapper.getFeeOfTenant(user);
    }


    @Override
    // 传入相关页面信息，实现分页
    public PageInfo<Questionnaire> splitPage(PageInfo<Questionnaire> pageInfo, List<Questionnaire> list) {
        // list传过来已经是所有结果，只是说，这个list可能是通过name,qid,title查询的
        pageInfo.setTotal(list.size());
        pageInfo.setList(new ArrayList<>());

        int pages = pageInfo.getPageNum();
        int pageSize = pageInfo.getPageSize();
        for (int i = (pages - 1) * pageSize, j = 0; i < list.size() && j < pageSize; i++, j++)
            pageInfo.getList().add(list.get(i));
        return pageInfo;
    }


    // 返回时间格式如：2020-02-17 00:00:00
    public static String getStartOfDay(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }

    // 返回时间格式如：2020-02-19 23:59:59
    public static String getEndOfDay(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }
}
